home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Games / WHDLoad / Src / programs / SP.asm < prev    next >
Encoding:
Assembly Source File  |  2001-09-23  |  14.8 KB  |  830 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    sp.asm
  3. ;  :Contents.    saves iff picture form dump file created by WHDLoad
  4. ;  :Author.    Bert Jahn
  5. ;  :EMail.    wepl@whdload.org
  6. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  7. ;  :Version.    $Id: SP.asm 1.8 2001/09/23 09:41:35 wepl Exp wepl $
  8. ;  :History.    13.07.98 started
  9. ;        03.08.98 reworked for new dump file
  10. ;        12.10.98 cskip added
  11. ;        17.01.99 recompile because error.i changed
  12. ;        15.03.99 cop/k and width/k added
  13. ;        08.08.00 argument for CopStop will be validated now
  14. ;             CopStop added to the copperlist dump
  15. ;        18.03.01 Ctrl-C for copdis added, better error handling
  16. ;        31.03.01 support for ehb pictures added
  17. ;             noop added
  18. ;        29.09.01 NoCopLst/S added
  19. ;             fmode=3 workaround added (Oxygene/Control titel picture)
  20. ;  :Requires.    OS V37+
  21. ;  :Copyright.    © 1998-2001 Bert Jahn, All Rights Reserved
  22. ;  :Language.    68020 Assembler
  23. ;  :Translator.    Barfly 2.9
  24. ;---------------------------------------------------------------------------*
  25. ;##########################################################################
  26.  
  27.     INCDIR    Includes:
  28.     INCLUDE    lvo/exec.i
  29.     INCLUDE    exec/memory.i
  30.     INCLUDE    lvo/dos.i
  31.     INCLUDE    dos/dos.i
  32.     INCLUDE    hardware/custom.i
  33.     
  34.     INCLUDE    whddump.i
  35.     INCLUDE    macros/ntypes.i
  36.  
  37. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  38.  
  39. GL    EQUR    A4        ;a4 ptr to Globals
  40. LOC    EQUR    A5        ;a5 for local vars
  41.  
  42.     STRUCTURE    ArgArray,0
  43.         ULONG    aa_output
  44.         ULONG    aa_cop
  45.         ULONG    aa_copstop
  46.         ULONG    aa_width
  47.         ULONG    aa_height
  48.         ULONG    aa_con0
  49.         ULONG    aa_mod1
  50.         ULONG    aa_mod2
  51.         ULONG    aa_pt1
  52.         ULONG    aa_pt2
  53.         ULONG    aa_pt3
  54.         ULONG    aa_pt4
  55.         ULONG    aa_nocoplst
  56.         LABEL    aa_SIZEOF
  57.  
  58.     NSTRUCTURE    Globals,0
  59.         NAPTR    gl_execbase
  60.         NAPTR    gl_dosbase
  61.         NAPTR    gl_rdargs
  62.         NSTRUCT    gl_rdarray,aa_SIZEOF
  63.         NALIGNLONG
  64.         NLABEL    gl_SIZEOF
  65.  
  66. ;##########################################################################
  67.  
  68.     PURE
  69.     OUTPUT    C:SP
  70.     SECTION    "",CODE
  71.     BOPT    O+                ;enable optimizing
  72.     BOPT    OG+                ;enable optimizing
  73.     BOPT    ODd-                ;disable mul optimizing
  74.     BOPT    ODe-                ;disable mul optimizing
  75.     MC68020
  76.  
  77. VER    MACRO
  78.         dc.b    "SP 1.5 "
  79.     DOSCMD    "WDate >t:date"
  80.     INCBIN    "t:date"
  81.         dc.b    " by Wepl"
  82.     ENDM
  83.  
  84.         bra    .start
  85.         dc.b    "$VER: "
  86.         VER
  87.         dc.b    " V37+",0
  88.     CNOP 0,2
  89. .start
  90.  
  91. ;##########################################################################
  92.  
  93.         link    GL,#gl_SIZEOF
  94.         move.l    (4).w,(gl_execbase,GL)
  95.         
  96.         move.l    #37,d0
  97.         lea    (_dosname),a1
  98.         move.l    (gl_execbase,GL),a6
  99.         jsr    _LVOOpenLibrary(a6)
  100.         move.l    d0,(gl_dosbase,GL)
  101.         beq    .nodoslib
  102.  
  103.         lea    (_ver),a0
  104.         bsr    _Print
  105.  
  106.         lea    (gl_rdarray,GL),a0
  107.         moveq    #aa_SIZEOF/4-1,d0
  108. .0        clr.l    (a0)+
  109.         dbf    d0,.0
  110.  
  111.         lea    (_template),a0
  112.         move.l    a0,d1
  113.         lea    (gl_rdarray,GL),a0
  114.         move.l    a0,d2
  115.         moveq    #0,d3
  116.         move.l    (gl_dosbase,GL),a6
  117.         jsr    (_LVOReadArgs,a6)
  118.         move.l    d0,(gl_rdargs,GL)
  119.         bne    .argsok
  120.         lea    (_readargs),a0
  121.         bsr    _PrintErrorDOS
  122.         bra    .noargs
  123. .argsok
  124.         move.l    (gl_rdarray+aa_copstop,GL),d0
  125.         beq    .copstop
  126.         move.l    d0,a0
  127.         bsr    _etoi
  128.         move.l    d0,(gl_rdarray+aa_copstop,GL)
  129.         ble    .copstoperr
  130.         tst.b    (a0)
  131.         beq    .copstop
  132. .copstoperr    lea    (_badcopstop),a0
  133.         bsr    _Print
  134.         bra    .opend
  135. .copstop
  136.  
  137.         bsr    _Main
  138. .opend
  139.         move.l    (gl_rdargs,GL),d1
  140.         move.l    (gl_dosbase,GL),a6
  141.         jsr    (_LVOFreeArgs,a6)
  142. .noargs
  143.         move.l    (gl_dosbase,GL),a1
  144.         move.l    (gl_execbase,GL),a6
  145.         jsr    (_LVOCloseLibrary,a6)
  146. .nodoslib
  147.         unlk    GL
  148.         moveq    #0,d0
  149.         rts
  150.  
  151. ;##########################################################################
  152.  
  153.     NSTRUCTURE    local_main,0
  154.         NAPTR    lm_fileptr
  155.         NULONG    lm_filesize
  156.         NAPTR    lm_header
  157.         NAPTR    lm_cust
  158.         NAPTR    lm_mem
  159.         NULONG    lm_cmapsize
  160.         NULONG    lm_bodysize
  161.         NULONG    lm_destptr
  162.         NSTRUCT    lm_colors,256*3
  163.         NWORD    lm_widthskip        ;amount of bytes which are displayed
  164.                         ;but will not be written to dest
  165.         NBYTE    lm_ehb            ;extra half brite
  166.         NALIGNLONG
  167.         NLABEL    lm_SIZEOF
  168.  
  169. _Main        movem.l    d2-d7/a2-a3/a6,-(a7)
  170.         link    LOC,#lm_SIZEOF
  171.         
  172.         lea    (lm_colors,LOC),a0
  173.         moveq    #256*3/8-1,d0
  174. .clr4        clr.l    (a0)+
  175.         clr.l    (a0)+
  176.         dbf    d0,.clr4
  177.  
  178.         lea    (_name),a0
  179.         bsr    _LoadFileMsg
  180.         move.l    d1,(lm_filesize,LOC)
  181.         move.l    d0,(lm_fileptr,LOC)
  182.         beq    .afilefree
  183.  
  184.         clr.l    (lm_mem,LOC)
  185.         clr.l    (lm_cust,LOC)
  186.         clr.l    (lm_header,LOC)
  187.  
  188.         cmp.l    #20,d1
  189.         blt    .filefree
  190.  
  191.         move.l    d0,a0
  192.         cmp.l    #"FORM",(a0)+
  193.         bne    .filefree
  194.         subq.l    #8,d1
  195.         cmp.l    (a0)+,d1
  196.         bne    .filefree
  197.         cmp.l    #ID_WHDD,(a0)+
  198.         bne    .filefree
  199.         subq.l    #4,d1
  200. .idn        move.l    (a0)+,d0
  201.         move.l    (a0)+,d2
  202.         subq.l    #8,d1
  203.         bcs    .filefree
  204.         cmp.l    #ID_CUST,d0
  205.         bne    .id1
  206.         move.l    a0,(lm_cust,LOC)
  207. .id1        cmp.l    #ID_MEM,d0
  208.         bne    .id2
  209.         move.l    a0,(lm_mem,LOC)
  210. .id2        cmp.l    #ID_HEAD,d0
  211.         bne    .id3
  212.         move.l    a0,(lm_header,LOC)
  213. .id3        add.l    d2,a0
  214.         sub.l    d2,d1
  215.         bcs    .filefree
  216.         bne    .idn
  217.  
  218.         tst.l    (lm_mem,LOC)
  219.         beq    .filefree
  220.         tst.l    (lm_cust,LOC)
  221.         beq    .filefree
  222.         tst.l    (lm_header,LOC)
  223.         beq    .filefree
  224.  
  225.         move.l    (lm_header,LOC),a0
  226.         move.l    (wdh_BaseMemSize,a0),-(a7)
  227.         pea    (_mem_text)
  228.         bsr    _pf
  229.         addq.l    #8,a7
  230.  
  231.         move.l    (lm_cust,LOC),a3    ;A3 = custom
  232.  
  233.     ;copy color entries
  234.         lea    (color,a3),a0
  235.         lea    (lm_colors,LOC),a1
  236.         moveq    #31,d0
  237. .sc2        move.w    (a0)+,d1
  238.         bfextu    d1{20:4},d2
  239.         mulu    #$11,d2
  240.         move.b    d2,(a1)+
  241.         bfextu    d1{24:4},d2
  242.         mulu    #$11,d2
  243.         move.b    d2,(a1)+
  244.         bfextu    d1{28:4},d2
  245.         mulu    #$11,d2
  246.         move.b    d2,(a1)+
  247.         dbf    d0,.sc2
  248.  
  249.     ;print coplc's
  250.         movem.l    (cop1lc,a3),d0-d1
  251.         movem.l    d0-d1,-(a7)
  252.         pea    (_cop_text)
  253.         bsr    _pf
  254.         add.w    #12,a7
  255.     ;overwrite with arguments
  256.         move.l    (gl_rdarray+aa_cop,GL),d0
  257.         beq    .ncop
  258.         move.l    d0,a0
  259.         bsr    _etoi
  260.         move.l    d0,(cop1lc,a3)
  261. .ncop
  262.     ;dump copper lists
  263.         tst.l    (gl_rdarray+aa_nocoplst,GL)
  264.         bne    .nocoplst
  265.         bsr    _cdis
  266.         tst.l    d0
  267.         beq    .cdis_fail
  268. .nocoplst
  269.     ;move cop writes to custom table
  270.         bsr    _copwrite
  271.  
  272.     ;overwrite with arguments
  273.         bsr    _withargs
  274.  
  275.     ;depth
  276.         bfextu    (bplcon0,a3){1:3},d6
  277.         bne    .3
  278.         moveq    #8,d6            ;D6 = depth
  279. .3
  280.     ;height
  281.         bfextu    (diwstrt,a3){0:8},d0
  282.         bfextu    (diwstop,a3){0:8},d5
  283.         tst.b    d5
  284.         bmi    .4
  285.         add.w    #256,d5
  286. .4        sub.l    d0,d5            ;D5 = height
  287.  
  288.     ;width
  289.     ifeq 1
  290.         bfextu    (diwstrt,a3){8:8},d0
  291.         bfextu    (diwstop,a3){8:8},d4
  292.         add.w    #256,d4
  293.         sub.l    d0,d4            ;D4 = width
  294.     else
  295.         move.w    (ddfstop,a3),d4
  296.         sub.w    (ddfstrt,a3),d4
  297.         bfextu    (fmode,a3){14:2},d0
  298.         cmp.w    #3,d0
  299.         bne    .ddf1
  300.         mulu    #3,d4
  301.         addq.w    #8,d4
  302.         bra    .ddf2
  303. .ddf1        addq.w    #8,d4
  304.         add.w    d4,d4            ;D4 = width
  305. .ddf2
  306.     endc
  307.         tst.b    (bplcon0,a3)
  308.         bpl    .lores
  309.         add.w    d4,d4
  310. .lores
  311.         move.l    (gl_rdarray+aa_height,GL),d0
  312.         beq    .h
  313.         move.l    d0,a0
  314.         bsr    _etoi
  315.         move.l    d0,d5
  316. .h
  317.         move.w    d4,(lm_widthskip,LOC)
  318.         move.l    (gl_rdarray+aa_width,GL),d0
  319.         beq    .w
  320.         move.l    d0,a0
  321.         bsr    _etoi
  322.         move.l    d0,d4
  323. .w        move.w    (lm_widthskip,LOC),d0
  324.         sub.w    d4,d0
  325.         asr.w    #3,d0
  326.         move.w    d0,(lm_widthskip,LOC)
  327.  
  328.     ;check ehb
  329.         move.w    (bplcon0,a3),d0
  330.         and.w    #%1111110001010000,d0
  331.         cmp.w    #%0110000000000000,d0    ;HIRES=HAM=DPF=SHRES=0 depth=6
  332.         seq    (lm_ehb,LOC)
  333.         btst    #2,(bplcon2,a3)        ;KILLEHB
  334.         beq    .noehb
  335.         sf    (lm_ehb,LOC)
  336. .noehb
  337.  
  338.     ;calc pic size
  339.     ;FORM+ILBM
  340.         moveq    #12,d7
  341.     ;BMHD
  342.         add.l    #28,d7
  343.     ;CAMG
  344.         add.l    #12,d7
  345.     ;CMAP
  346.         moveq    #1,d0
  347.         lsl.l    d6,d0
  348.         tst.b    (lm_ehb,LOC)
  349.         beq    .noehb2
  350.         moveq    #1<<5,d0
  351. .noehb2        mulu    #3,d0
  352.         move.l    d0,(lm_cmapsize,LOC)
  353.         add.l    d0,d7
  354.         addq.l    #8,d7
  355.     ;BODY
  356.         move.l    d4,d0
  357.         add.w    #15,d0
  358.         lsr.l    #4,d0
  359.         add.l    d0,d0
  360.         mulu    d6,d0
  361.         mulu    d5,d0
  362.         move.l    d0,(lm_bodysize,LOC)
  363.         add.l    d0,d7
  364.         addq.l    #8,d7
  365.  
  366.         movem.l    d4-d6,-(a7)
  367.         pea    _dim_text
  368.         bsr    _pf
  369.         add.w    #16,a7
  370.         
  371.         tst.w    d4
  372.         beq    .adestfree
  373.         tst.w    d5
  374.         beq    .adestfree
  375.         tst.w    d6
  376.         beq    .adestfree
  377.  
  378.     ;get mem
  379.         move.l    d7,d0
  380.         moveq    #MEMF_ANY,d1
  381.         move.l    (gl_execbase,GL),a6
  382.         jsr    (_LVOAllocVec,a6)
  383.         move.l    d0,(lm_destptr,LOC)
  384.         bne    .memok
  385.         moveq    #0,d0
  386.         lea    (_nomem),a0
  387.         sub.l    a1,a1
  388.         bsr    _PrintError
  389.         bra    .adestfree
  390. .memok
  391.         move.l    d0,a2
  392.         move.l    #"FORM",(a2)+
  393.         move.l    d7,(a2)
  394.         subq.l    #8,(a2)+
  395.         move.l    #"ILBM",(a2)+
  396.     ;BMHD
  397.         move.l    #"BMHD",(a2)+
  398.         move.l    #20,(a2)+
  399.         move.w    d4,(a2)+
  400.         move.w    d5,(a2)+
  401.         clr.l    (a2)+            ;xpos,ypos
  402.         move.w    d6,d0
  403.         move.b    d0,(a2)+
  404.         clr.b    (a2)+            ;mask
  405.         clr.b    (a2)+            ;compression
  406.         clr.b    (a2)+            ;pad
  407.         clr.w    (a2)+            ;trans col
  408.         move.b    #10,(a2)+        ;x aspect
  409.         move.b    #11,(a2)+        ;y aspect
  410.         move.w    d4,(a2)+        ;screen
  411.         move.w    d5,(a2)+
  412.     ;CAMG
  413.         move.l    #"CAMG",(a2)+
  414.         move.l    #4,(a2)+
  415.         clr.w    (a2)+
  416.         move.w    (bplcon0,a3),(a2)+
  417.     ;CMAP
  418.         move.l    #"CMAP",(a2)+
  419.         move.l    (lm_cmapsize,LOC),d2
  420.         move.l    d2,(a2)+
  421.         lea    (lm_colors,LOC),a0
  422. .cmap        move.w    (a0)+,(a2)+
  423.         subq.l    #2,d2
  424.         bne    .cmap
  425.     ;BODY
  426.         move.l    #"BODY",(a2)+
  427.         move.l    (lm_bodysize,LOC),(a2)+
  428.         moveq    #0,d3            ;d3 = plane
  429.  
  430.         move.w    d5,d3            ;height
  431.  
  432. .9        lea    (bplpt,a3),a0
  433.         move.w    d6,d1            ;depth
  434. .8        move.l    (a0),a1
  435.         add.l    (lm_mem,LOC),a1
  436.         move.w    d4,d0            ;width
  437.         add.w    #15,d0
  438.         lsr.w    #4,d0
  439. .7        move.w    (a1)+,(a2)+
  440.         subq.w    #1,d0
  441.         bne    .7
  442.         sub.l    (lm_mem,LOC),a1
  443.         move.l    a1,(a0)+
  444.         subq.w    #1,d1
  445.         bne    .8
  446.         
  447.         movem.w    (bpl1mod,a3),d0-d1
  448.         lea    (bplpt,a3),a0
  449.         moveq    #4-1,d2
  450. .6        move.l    (a0),a1
  451.         add.w    d0,a1
  452.         add.w    (lm_widthskip,LOC),a1
  453.         move.l    a1,(a0)+
  454.         move.l    (a0),a1
  455.         add.w    d1,a1
  456.         add.w    (lm_widthskip,LOC),a1
  457.         move.l    a1,(a0)+
  458.         dbf    d2,.6
  459.         
  460.         subq.w    #1,d3
  461.         bne    .9
  462.  
  463.         move.l    d7,d0
  464.         move.l    (lm_destptr,LOC),a0
  465.         move.l    (gl_rdarray+aa_output,GL),d1
  466.         move.l    d1,a1
  467.         bsr    _SaveFileMsg
  468.  
  469.         move.l    (lm_destptr,LOC),a1
  470.         move.l    (gl_execbase,GL),a6
  471.         jsr    (_LVOFreeVec,a6)
  472. .adestfree
  473. .cdis_fail
  474. .filefree
  475.         move.l    (lm_fileptr,LOC),a1
  476.         move.l    (gl_execbase,GL),a6
  477.         jsr    (_LVOFreeVec,a6)
  478. .afilefree
  479.         unlk    LOC
  480.         movem.l    (a7)+,d2-d7/a2-a3/a6
  481.         rts
  482.  
  483. ;##########################################################################
  484.  
  485. _cdis        moveq    #0,d4            ;d4 = list number
  486.         move.l    (cop1lc,a3),d5        ;d5 = lc1
  487.         move.l    (cop2lc,a3),d6        ;d6 = lc2
  488.  
  489. .j1        move.l    d5,a0
  490. .nlc        addq.l    #1,d4
  491.         add.l    (lm_mem,LOC),a0
  492.         
  493.         move.l    d4,-(a7)
  494.         pea    (_copdump_text)
  495.         bsr    _pf
  496.         add.l    #8,a7
  497.  
  498. .next
  499.     ;check Ctrl-C
  500.         move.l    a0,-(a7)
  501.         bsr    _CheckBreak
  502.         move.l    (a7)+,a0
  503.         tst.l    d0
  504.         bne    .fail
  505.         
  506.     ;check memory bounds
  507.         move.l    (lm_mem,LOC),d0
  508.         cmp.l    a0,d0
  509.         bhi    .fail_mem
  510.         move.l    (lm_header,LOC),a1
  511.         add.l    (wdh_BaseMemSize,a1),d0
  512.         subq.l    #4,d0
  513.         cmp.l    a0,d0
  514.         blo    .fail_mem
  515.  
  516.     ;check copstop
  517.         move.l    a0,d0
  518.         sub.l    (lm_mem,LOC),d0
  519.         cmp.l    (gl_rdarray+aa_copstop,GL),d0
  520.         beq    .copstop
  521.  
  522.         bsr    _pa            ;print address
  523.         cmp.l    #-2,(a0)
  524.         beq    .e
  525.         movem.w    (a0)+,d0-d1
  526.         btst    #0,d0
  527.         beq    .m
  528.         btst    #0,d1
  529.         beq    .w
  530.  
  531.     ;skip
  532. .s        lsr.w    #1,d0
  533.         ext.l    d0
  534.         ror.l    #7,d0
  535.         lsl.w    #7,d0
  536.         lsr.l    #7,d0
  537.         move.l    d0,-(a7)
  538.         pea    .cskip
  539.         bsr    _pf
  540.         addq.l    #8,a7
  541.         bra    .next
  542.  
  543.     ;wait
  544. .w        lsr.w    #1,d0
  545.         ext.l    d0
  546.         ror.l    #7,d0
  547.         lsl.w    #7,d0
  548.         lsr.l    #7,d0
  549.         move.l    d0,-(a7)
  550.         pea    .cwait
  551.         bsr    _pf
  552.         addq.l    #8,a7
  553.         bra    .next
  554.  
  555.     ;move
  556. .m        addq.w    #2,d0
  557.         cmp.w    (a0),d0
  558.         beq    .lm
  559.         subq.w    #2,d0
  560.         move.w    d0,-(a7)
  561.         move.w    d1,-(a7)
  562.         pea    .cmove
  563.         bsr    _pf
  564.         addq.l    #8,a7
  565.         bsr    _pc
  566.         cmp.w    #noop,d0
  567.         bhi    .fail_adr
  568.         cmp.w    #copjmp1,d0
  569.         beq    .j1
  570.         cmp.w    #copjmp2,d0
  571.         bne    .next
  572.         move.l    d6,a0
  573.         bra    .nlc
  574.  
  575.     ;move long
  576. .lm        subq.w    #2,d0
  577.         addq.l    #2,a0
  578.         move.w    d0,d2
  579.         move.w    d1,d0
  580.         move.w    (a0)+,d1
  581.         movem.w    d0-d3,-(a7)
  582.         cmp.w    #cop1lc,d2
  583.         bne    .lm1
  584.         move.l    (a7),d5
  585. .lm1        cmp.w    #cop2lc,d2
  586.         bne    .lm2
  587.         move.l    (a7),d6
  588. .lm2        pea    .clmove
  589.         bsr    _pf
  590.         add.w    #12,a7
  591.         move.w    d2,d0
  592.         bsr    _pc
  593.         bra    .next
  594.  
  595. .e        pea    .cend
  596.         bsr    _p
  597.  
  598. .q        moveq    #-1,d0
  599.         rts
  600. .copstop    lea    (.cs),a0
  601.         bsr    _Print
  602.         bra    .q
  603.  
  604. .fail        moveq    #0,d0
  605.         rts
  606. .fail_mem    lea    (.mem),a0
  607.         bsr    _Print
  608.         bra    .fail
  609. .fail_adr    lea    (.adr),a0
  610.         bsr    _Print
  611.         bra    .fail
  612.  
  613. .cend        dc.b    "CEND",10,0
  614. .cmove        dc.b    "CMOVE    #$%04x,$%04x    ",0
  615. .clmove        dc.b    "CLMOVE    #$%08lx,$%04x",0
  616. .cwait        dc.b    "CWAIT    %d,%d",10,0
  617. .cskip        dc.b    "CSKIP    %d,%d",10,0
  618. .mem        dc.b    "copperlist outside BaseMem!",10,0
  619. .adr        dc.b    "invalid CMOVE destination!",10,0
  620. .cs        dc.b    "*** copstop ***",10,0
  621.     EVEN
  622.  
  623. ;print address
  624. _pa        movem.l    d0-d1/a0-a1,-(a7)
  625.         sub.l    (lm_mem,LOC),a0
  626.         move.l    a0,-(a7)
  627.         pea    .1
  628.         bsr    _pf
  629.         addq.l    #8,a7
  630.         movem.l    (a7)+,_MOVEMREGS
  631.         rts
  632. .1        dc.b    "$%06lx ",0
  633.     EVEN
  634.  
  635. ;print string
  636. _p        movem.l    d0-d1/a0-a1,-(a7)
  637.         move.l    (20,a7),a0
  638.         bsr    _PrintArgs
  639.         movem.l    (a7)+,_MOVEMREGS
  640.         rtd    #4
  641.  
  642. ;printf
  643. _pf        movem.l    d0-d1/a0-a1,-(a7)
  644.         move.l    (20,a7),a0
  645.         lea    (24,a7),a1
  646.         bsr    _PrintArgs
  647.         movem.l    (a7)+,_MOVEMREGS
  648.         rts
  649.  
  650. ;print custom
  651. _pc        movem.l    d0-d1/a0-a1,-(a7)
  652.         bsr    _GetCustomName
  653.         move.l    d0,-(a7)
  654.         pea    .2
  655.         bne    .1
  656.         addq.l    #4,a7
  657.         pea    .3
  658. .1        bsr    _pf
  659.         addq.l    #8,a7
  660.         movem.l    (a7)+,_MOVEMREGS
  661.         rts
  662.  
  663. .2        dc.b    "    ;%s"
  664. .3        dc.b    10,0
  665.     EVEN
  666.  
  667. ;##########################################################################
  668.  
  669. _copwrite    moveq    #-1,d5
  670.         move.l    (gl_rdarray+aa_copstop,GL),d0
  671.         beq    .cse
  672.         move.l    d0,d5
  673.         add.l    (lm_mem,LOC),d5
  674. .cse
  675. .j1        move.l    (cop1lc,a3),a0
  676. .off        add.l    (lm_mem,LOC),a0
  677.  
  678. .c1n        cmp.l    #-2,(a0)
  679.         beq    .c1e
  680.         cmp.l    d5,a0
  681.         beq    .c1e
  682.         movem.w    (a0)+,d0-d1
  683.         btst    #0,d0
  684.         bne    .c1n
  685.         cmp.w    #copjmp1,d0
  686.         beq    .j1
  687.         cmp.w    #copjmp2,d0
  688.         bne    .c
  689.         move.l    (cop2lc,a3),a0
  690.         bra    .off
  691.         
  692. .c        cmp.w    #color,d0
  693.         blo    .c1u
  694.         cmp.w    #color+62,d0
  695.         bhi    .c1u
  696.  
  697.     ;color register
  698.         bfextu    (bplcon3,a3){0:3},d2    ;bank
  699.         mulu    #256/8*3,d2
  700.         lea    (lm_colors.w,LOC,d2.w),a1
  701.         sub.w    #color,d0
  702.         lsr.w    #1,d0
  703.         mulu    #3,d0
  704.         add.w    d0,a1
  705.         bfextu    d1{20:4},d2
  706.         mulu    #$11,d2
  707.         bfextu    d1{24:4},d3
  708.         mulu    #$11,d3
  709.         bfextu    d1{28:4},d4
  710.         mulu    #$11,d4
  711.         btst    #9,(bplcon3,a3)        ;LOCT ?
  712.         bne    .c1l
  713.         move.b    d2,(a1)+
  714.         move.b    d3,(a1)+
  715.         move.b    d4,(a1)
  716.         bra    .c1n
  717. .c1l        bfins    d2,(a1){4:4}
  718.         bfins    d3,(1,a1){4:4}
  719.         bfins    d4,(2,a1){4:4}
  720.         bra    .c1n
  721.  
  722. .c1u        move.w    d1,(a3,d0.w)
  723.         or.w    #$8080,($200.w,a3,d0.w)
  724.         bra    .c1n
  725. .c1e
  726.         rts
  727.  
  728. ;##########################################################################
  729.  
  730. _withargs
  731.         move.l    (gl_rdarray+aa_con0,GL),d0
  732.         beq    .0
  733.         move.l    d0,a0
  734.         bsr    _etoi
  735.         move.w    d0,(bplcon0,a3)
  736. .0
  737.         move.l    (gl_rdarray+aa_mod1,GL),d0
  738.         beq    .1
  739.         move.l    d0,a0
  740.         bsr    _etoi
  741.         move.w    d0,(bpl1mod,a3)
  742. .1        move.l    (gl_rdarray+aa_mod2,GL),d0
  743.         beq    .2
  744.         move.l    d0,a0
  745.         bsr    _etoi
  746.         move.w    d0,(bpl2mod,a3)
  747. .2
  748.         move.l    (gl_rdarray+aa_pt1,GL),d0
  749.         beq    .p1
  750.         move.l    d0,a0
  751.         bsr    _etoi
  752.         move.l    d0,(bplpt,a3)
  753. .p1        move.l    (gl_rdarray+aa_pt2,GL),d0
  754.         beq    .p2
  755.         move.l    d0,a0
  756.         bsr    _etoi
  757.         move.l    d0,(bplpt+4,a3)
  758. .p2        move.l    (gl_rdarray+aa_pt3,GL),d0
  759.         beq    .p3
  760.         move.l    d0,a0
  761.         bsr    _etoi
  762.         move.l    d0,(bplpt+8,a3)
  763. .p3        move.l    (gl_rdarray+aa_pt4,GL),d0
  764.         beq    .p4
  765.         move.l    d0,a0
  766.         bsr    _etoi
  767.         move.l    d0,(bplpt+12,a3)
  768. .p4
  769.         rts
  770.  
  771. ;##########################################################################
  772.  
  773.     INCDIR    Sources:
  774.     INCLUDE    dosio.i
  775.         PrintArgs
  776.         Print
  777.         CheckBreak
  778.     INCLUDE    error.i
  779.         PrintErrorDOS
  780.     INCLUDE    files.i
  781.         LoadFileMsg
  782.         SaveFileMsg
  783.     INCLUDE    hardware.i
  784.         GetCustomName
  785.     INCLUDE    strings.i
  786.         etoi
  787.  
  788. ;##########################################################################
  789.  
  790. _name        dc.b    ".whdl_dump",0
  791.  
  792. _mem_text    dc.b    "BaseMemSize=$%lx",10,0
  793. _cop_text    dc.b    "cop1lc=$%lx cop2lc=$%lx",10,0
  794. _copdump_text    dc.b    "*** copperlist %ld ***",10,0
  795. _badci_text    dc.b    "bad copper instruction: %8lx",10,0
  796. _dim_text    dc.b    "width=%ld height=%ld depth=%ld",10,0
  797.  
  798. ; Errors
  799. _nomem        dc.b    "not enough free store",0
  800. _badcopstop    dc.b    "invalid argument for CopStop",10,0
  801.  
  802. ; Operationen
  803. _readargs    dc.b    "read arguments",0
  804.  
  805. ;subsystems
  806. _dosname    dc.b    "dos.library",0
  807.  
  808. _template    dc.b    "OutputFile/A"
  809.         dc.b    ",Cop/K"
  810.         dc.b    ",CS=CopStop/K"
  811.         dc.b    ",Width/K"
  812.         dc.b    ",Height/K"
  813.         dc.b    ",con0/K"
  814.         dc.b    ",mod1/K"
  815.         dc.b    ",mod2/K"
  816.         dc.b    ",pt1/K"
  817.         dc.b    ",pt2/K"
  818.         dc.b    ",pt3/K"
  819.         dc.b    ",pt4/K"
  820.         dc.b    ",NoCopLst/S"
  821.         dc.b    0
  822.  
  823. _ver        VER
  824.         dc.b    10,0
  825.  
  826. ;##########################################################################
  827.  
  828.     END
  829.  
  830.